#ifndef _SUNSHINE_DATETIME_
#define _SUNSHINE_DATETIME_
/*
 * 获取时间相关的数据
 * *
 * lee sunshine
 * lss876@qq.com                                                                                                                          
 * Aug 30th, 2012
 */

#include <time.h>
#include <sys/time.h> // gettimeofday(struct timeval *, struct timezone *)
#include <stdio.h>
#include <string>
using std::string;

namespace SUNSHINE
{
	class DateTime
	{
		public:
			/*
			 * 获取当前秒值
			 * *
			 * [0 - 59] 
			 * 返回 当前时间 中的 秒值
			 */
			inline static int Second()
			{
				DateTime::Refresh();
				return DateTime::lt->tm_sec;
			}

			/*
			 * 获取当前毫秒值
			 * *
			 * [0 - 999] 
			 * 返回 当前时间 中的 毫秒值
			 */
			static int Millisecond();

			/*
			 * 获取当前微秒值
			 * *
			 * [0 - 999999] 
			 * 返回 当前时间 中的 微秒值
			 */
			static long Microsecond()
			{
				timeval tv;
				gettimeofday(&tv, NULL);
				return tv.tv_usec;
			}

			/*
			 * 获取当前分钟值
			 * *
			 * [0 - 59] 
			 * 返回 当前时间 中的 分钟值
			 */
			static int Minute()
			{
				DateTime::Refresh();
				return DateTime::lt->tm_min;
			}

			/*
			 * 获取当前时钟值
			 * *
			 * [0 - 23] 
			 * 返回 当前时间 中的 时钟值
			 */
			static int Hour()
			{
				DateTime::Refresh();
				return DateTime::lt->tm_hour;
			}

			/*
			 * 获取 当前日 是 该月中的 第几天
			 * *
			 * [1 - 31] 
			 * 返回 当前日 在 该月中的 索引值
			 */
			static int Day()
			{
				DateTime::Refresh();
				return DateTime::lt->tm_mday;
			}

			/*
			 * 获取 当前日 是 该星期的 第几天
			 * *
			 * [0 - 6] 
			 * 返回 当前日 在 该星期中的 索引值(0 - Sunday)
			 */
			static int DayOfWeek();

			/*
			 * 获取 当前日 是 该年的 第几天
			 * *
			 * [0 - 365] 
			 * 返回 当前日 在 该年中的 索引值(365 - 闰年的最后一天)
			 */
			static int DayOfYear();

			/*
			 * 获取当前的月份值
			 * *
			 * [1 - 12] 
			 * 返回 当前时间 中的 月份值
			 */
			static int Month()
			{
				DateTime::Refresh();
				return DateTime::lt->tm_mon + 1;
			}

			/*
			 * 获取当前年份值
			 * *
			 * 返回 当前时间 中的 年份值
			 */
			static int Year()
			{
				DateTime::Refresh();
				return DateTime::lt->tm_year + 1900;
			}

			/*
			 * 获取当前时间字符串
			 * *
			 * 返回 指定字符分割的 当前时间 的 字符串
			 * *
			 * delimiter[in, nullable] : 指定的字符(时, 分, 秒之间的分隔符)
			 */
			static string Time(char delimiter = '\0');

			/*
			 * 获取当前日期字符串
			 * *
			 * 返回 指定字符分割的 当前日期 的 字符串
			 * *
			 * delimiter[in, nullable] : 指定的字符(时, 分, 秒之间的分隔符)
			 */
			static string Date(char delimiter = '\0');

			/*
			 * 获取当前日期时间字符串
			 * *
			 * 返回 指定字符分割的 包含当前日期和时间 的 字符串
			 * *
			 * dateDelimiter [in, nullable] : 指定的年, 月, 日之间的分隔符  
			 * timeDelimiter [in, nullable] : 指定的时, 分, 秒之间的分隔符
			 * delimiterBetweenDateAndTime[in, nullable] : 指定的日期和时间之间的分隔符
			 */
			static string DateAndTime(char dateDelimiter = '\0',
						char timeDelimiter = '\0',
						const string & delimiterBetweenDateAndTime = "");

		private:
			static time_t timer;
			static struct tm * lt;

		private:
			/*
			 * 刷新当前时间
			 */
			static void Refresh()
			{
				DateTime::timer = time(NULL);
				DateTime::lt = localtime(&(DateTime::timer));
			}

			/*
			 * 组装日期或者时间的格式字符串
			 * *
			 * format[in, out] : 要组装的格式字符串
			 * delimiter[in] : 指定的分隔符
			 */
			static void CreateFormatStringBy(string & format, const char & delimiter)
			{
				if (delimiter)
				{
					format.append(1, delimiter).append("%02d")
						.append(1, delimiter).append("%02d");
				}
				else
				{
					format.append("%02d%02d");
				}
			}
	};

}

#endif
